#ifndef TRLOADER_H
#define TRLOADER_H

#include <QtCore/qglobal.h>
#include <QMap>
#include <QObject>
#include <QVariant>
#include <QLibrary>
#include <memory>
#include <atomic>
#include <nlohmann/json.hpp>
#include "ThostFtdcTraderApi.h"
#include "TrTypes.h"

#if defined(TRLOADER_LIBRARY)
#  define TRLOADER_EXPORT Q_DECL_EXPORT
#else
#  define TRLOADER_EXPORT Q_DECL_IMPORT
#endif

typedef CThostFtdcTraderApi* (*CTPCreator)(const char*);

class TRLOADER_EXPORT TrLoader : public QObject, public CThostFtdcTraderSpi
{
    Q_OBJECT
public:
    explicit TrLoader(QObject *parent = nullptr);
    ~TrLoader();

    // 初始化和控制
    bool init(const QString& configFile);  // 使用配置文件初始化
    bool init(const QMap<QString, QVariant>& conf);  // 使用配置信息初始化
    void start();
    void stop();
    void release();

    // 查询接口
    bool isConnected() const { return m_connected; }
    bool isLoggedIn() const { return m_loggedIn; }
    const QString& getBrokerID() const { return m_brokerID; }
    const QString& getUserID() const { return m_userID; }
    const QString& getPassword() const { return m_password; }
    const QString& getAuthCode() const { return m_authCode; }
    const QString& getAppID() const { return m_appID; }

protected:
    // CTP回调函数
    void OnFrontConnected() override;
    void OnRspAuthenticate(CThostFtdcRspAuthenticateField* pRspAuthenticateField, 
                          CThostFtdcRspInfoField* pRspInfo, 
                          int nRequestID, 
                          bool bIsLast) override;
    void OnFrontDisconnected(int nReason) override;
    void OnHeartBeatWarning(int nTimeLapse) override;
    void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, 
                       CThostFtdcRspInfoField *pRspInfo, 
                       int nRequestID, 
                       bool bIsLast) override;
    void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, 
                        CThostFtdcRspInfoField *pRspInfo, 
                        int nRequestID, 
                        bool bIsLast) override;
    void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, 
                           CThostFtdcRspInfoField *pRspInfo, 
                           int nRequestID, 
                           bool bIsLast) override;

signals:
    void started();                                    // 服务启动信号
    void stopped();                                    // 服务停止信号
    void connected();                                  // 连接成功信号
    void disconnected(int reason);                     // 连接断开信号
    void heartbeatWarning(int timeLapse);             // 心跳超时警告信号
    void loginSuccess(const QString& msg);             // 登录成功信号
    void loginFailed(const QString& error);            // 登录失败信号
    void logoutSuccess(const QString& msg);            // 登出成功信号
    void instrumentsUpdated();                         // 合约信息更新信号
    void error(const QString& error, int errorId = 0); // 错误信号

private:
    // 内部辅助函数
    bool loadCtpLibrary();
    void reqAuthenticate();
    void reqUserLogin();
    void reqQryInstrument();
    bool hasError(CThostFtdcRspInfoField *pRspInfo);
    QString getErrorMsg(CThostFtdcRspInfoField *pRspInfo);
    bool loadConfig(const QString& configFile);        // 加载配置文件
    bool loadProductMapping(const QString& path, QMap<QString, QString>& name, QMap<QString, QString>& session);

private:
    // CTP API相关
    QLibrary* m_library{nullptr};                     // CTP动态库
    CThostFtdcTraderApi* m_pUserApi{nullptr};         // CTP API实例
    CTPCreator m_creator{nullptr};                    // 创建API函数指针
    std::atomic<bool> m_connected{false};             // 连接状态
    std::atomic<bool> m_loggedIn{false};             // 登录状态
    std::atomic<bool> m_authenticating{false};        // 认证状态
    std::atomic<bool> m_querying{false};             // 查询状态
    int m_requestID{0};                              // 请求ID

    // 配置信息
    QString m_brokerID;                              // 经纪商代码
    QString m_userID;                                // 用户ID
    QString m_password;                              // 密码
    QString m_authCode;                              // 认证码
    QString m_appID;                                 // 应用ID
    QString m_frontAddr;                             // 前置机地址
    QString m_flowPath;                              // 流文件路径
    QString m_modulePath;                            // CTP库文件路径
    QString m_mapPath;                               // 合约映射文件路径
    QString m_contractsPath;                         // 合约信息文件路径
    bool m_initialized{false};                       // 初始化标志

    // 用于存储品种映射信息
    QMap<QString, QString> m_productNameMap;         // 品种名称映射
    QMap<QString, QString> m_productSessionMap;      // 品种交易时间映射
    nlohmann::json m_contractsJson;                  // 合约信息JSON对象
};

#endif // TRLOADER_H